#pragma once
#include "gtest/gtest.h"

#include "Utility/FileSystem/SGFileSystem.h"

#include "../BoxSectionNumericalCalculator.h"
#include "../Interface/BeamSectionNumericalCalculatorFactory.h"
#include "../SectionCalculator/writeVtk.h"

using SG::DataStructure::FEM::BeamSectionStandardTypes;
using SG::DataStructure::FEM::PBARLData;
using SG::FEMSolver::Element::BeamSectionNumericalCalculatorFactory;
using SG::FEMSolver::Element::BoxSectionNumericalCalculator;

// 将 BeamSectionNumericalCalculatorFactory 生成对象测试放置在具体截面属性计算中
TEST (BeamSectionNumericalCalculatorFactoryTest, BoxSectionCalculatorCreate)
{
    // Test data
    auto calculatorPtr    = BeamSectionNumericalCalculatorFactory::Create (BeamSectionStandardTypes::BEAMSECTYPE_BOX);
    auto boxCalculatorPtr = dynamic_cast<BoxSectionNumericalCalculator*> (calculatorPtr.get ());

    // Check
    ASSERT_TRUE (nullptr != boxCalculatorPtr);
}

// Box 截面网格划分测试
TEST (BeamSectionNumericalMeshTest, BoxSection)
{
    // Input data
    PBARLData section;
    section.SetBeamSectionStandardTypes (BeamSectionStandardTypes::BEAMSECTYPE_BOX);
    section.m_dimension = { 12.0, 16.0, 1.0, 2.0 };
    int refineLevel{ 5 };

    // Test data
    Meshes                        meshes;
    BoxSectionNumericalCalculator BoxSecMesher;
    BoxSecMesher.Mesh (section, _OUT meshes, refineLevel);
    std::string filename    = "BoxBeamSectionMesh";
    std::string discription = "BOX-Type Beam Section Mesh";
    SG::FEMSolver::Element::writeVtk (meshes, filename, discription);
    auto fileTest = SG::Utility::FileSystem::getFullPath (filename + ".vtk");

    // Target data
    auto fileTarget = SG::Utility::FileSystem::getTestDataPath ("SGFem/BeamSecPropCalculator/" + filename + "Target.vtk");

    // Check
    ASSERT_TRUE (SG::Utility::FileSystem::compareVTK (fileTarget, fileTest));
}